using GrapeCity.Forguncy.Commands;
using GrapeCity.Forguncy.Plugin;
using System;
using System.ComponentModel;
using System.Threading.Tasks;
using HttpUtil;
using System.IO;
using Newtonsoft.Json;
using System.Collections.Generic;
using static hikvision_signature.hikvision_signatureServerCommand;
using Newtonsoft.Json.Linq;
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Nodes;

namespace hikvision_signature
{
    [Icon("pack://application:,,,/hikvision_signature;component/Resources/Icon.png")]
    [Designer("hikvision_signature.Designer.hikvision_signatureServerCommandDesigner, hikvision_signature")]
    public class hikvision_signatureServerCommand : Command, ICommandExecutableInServerSideAsync
    {
        [FormulaProperty][DisplayName("合作方APPKey")][Required]
        public object aa01 { get; set; }

        [FormulaProperty][DisplayName("合作方APPSecret")][Required]
        public object aa02 { get; set; }

        [FormulaProperty][DisplayName("平台IP")][Required]
        public object aa03 { get; set; }

        [FormulaProperty][DisplayName("接口url")][Required]
        [Description("示例/api/resource/v2/camera/search，以/api开头，前面的不用输入")]
        public object aa04 { get; set; }

        [RadioGroupProperty(ValueList = "字符串|字节流")]
        [DisplayName("返回数据类别")]
        public string aa05 { get; set; } = "字节流";

        [FormulaProperty]
        [DisplayName("存储路径")]
        [Description("输入完成存储路径,如：d:\abc.jpg")]
        public object aa06 { get; set; }

        [Required][Description("必填项--默认https端口443")]
        [IntProperty(Min = 1, Max = 65535)]
        public int 平台端口 { get; set; } = 443;
        
        [Required][Description("必填项--单位秒，默认15秒")]
        public int 请求超时设置秒 { get; set; } = 15;

        [Required][Description("必填项--默认启用")]
        public bool 是否启用HTTPS协议 { get; set; } = true;

        [ListProperty]
        public List<liebiaocanshu> 请求参数 { get; set; }

        //动态隐藏
        public override bool GetDesignerPropertyVisible(string propertyName, CommandScope commandScope)
        {
            if (propertyName == nameof(aa06))
            {
                return aa05 == "字节流";
            }
            return base.GetDesignerPropertyVisible(propertyName, commandScope);
        }

        [ResultToProperty]
        [DisplayName("返回结果")]
        public string ResultTo { get; set; } = "返回结果";

        public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
        {
            var add1 = (await dataContext.EvaluateFormulaAsync(aa01))?.ToString() ?? string.Empty; // 计算的一个加数的公式值
            var add2 = (await dataContext.EvaluateFormulaAsync(aa02))?.ToString() ?? string.Empty; // 计算第二个家属的公式值
            var add3 = (await dataContext.EvaluateFormulaAsync(aa03))?.ToString() ?? string.Empty; // 计算第二个家属的公式值
            var add4 = (await dataContext.EvaluateFormulaAsync(aa04))?.ToString() ?? string.Empty; // 计算第二个家属的公式值

            //初始化平台参数合作方APPKey、合作方APPSecret、平台IP、平台端口、以及是否适用HTTPS协议
            HttpUtillib.SetPlatformInfo(add1, add2, add3, 平台端口, 是否启用HTTPS协议);
            //设置返回结果变量
            var result = new ExecuteResult();
            try
            {
                //获取参数结果并json序列化
                string body = JsonConvert.SerializeObject(await shujuchuli.dongtaishujuyuan(dataContext, 请求参数));
                var body01 = await shujuchuli.dongtaishujuyuan(dataContext, 请求参数);
                // 填充Url           
                string uri = "/artemis" + add4;
                // 发起POST请求，超时时间15秒，返回响应字节数组
                byte[] result01 = HttpUtillib.HttpPost(uri, body, 15);
                if (null == result01)
                {
                    //返回结果
                    string ab01 = $"向平台发送api请求失败:{uri},{add3}:{平台端口},{uri}";
                    return new ExecuteResult(){ErrCode = 202,Message = ab01};//设置返回内容
                }
                else
                {
                    if (aa05 == "字符串")
                    {
                        string ab01 = System.Text.Encoding.UTF8.GetString(result01);
                        //var ab02 = JsonConvert.DeserializeObject<JObject>(ab01);//解析字符串为json
                        //设置返回信息
                        result.ErrCode = 0;  // 设置成功的错误码（0 通常表示成功）
                        result.Message = ab01;
                        // 如果有额外的返回值，可以通过 ReturnValues 添加
                        //result.ReturnValues.Add("SuccessData", "返回的数据");
                    }
                    else
                    {
                        var add6 = (await dataContext.EvaluateFormulaAsync(aa06))?.ToString() ?? string.Empty; // 计算第二个家属的公式值
                        string tmp = System.Text.Encoding.UTF8.GetString(result01);
                        JObject obj = null;
                        try
                        {
                            // 说明是字符串，并且请求失败了
                            obj = (JObject)JsonConvert.DeserializeObject(tmp);
                            string ab01 = $"解析为字节流失败：{uri},{add3}:{平台端口}";
                            //设置返回信息
                            result.ErrCode = 201;  // 设置成功的错误码（0 通常表示成功）
                            result.Message = ab01;
                            //result.ProcessControl = ProcessControl.Return;  // 返回
                            //  Continue   继续执行。
                            //  BreakLoopAndContinue   跳过当前循环并继续执行。
                            //  ContinueLoop   跳过当前循环进入下一次循环。
                            // Return    返回。

                        }
                        catch (Exception e)
                        {
                            // 转换成json对象异常说明响应是字节流，并写入图片指定路径
                            File.WriteAllBytes(add6, result01);
                            result.ErrCode = 0;  // 设置成功的错误码（0 通常表示成功）
                            result.Message = add6;
                        }
                    }  
                }
            }
            catch (Exception err)
            {
                result.ErrCode = 201;  // 设置成功的错误码（0 通常表示成功）
                result.Message = err.ToString();
            }
            //return result;
            dataContext.Parameters[ResultTo] = result;
            return result;
        }


        public override string ToString()
        {
            return "海康openAPI签名服务端命令";
        }

        public override CommandScope GetCommandScope()
        {
            return CommandScope.ExecutableInServer;
        }

        public class liebiaocanshu : ObjectPropertyBase
        {
            [FormulaProperty]
            public object 参数名 { get; set; }
            [FormulaProperty]
            public object 参数值 { get; set; }
        }

   
    }
}
